批量篡改请求资源为本地文件
概述
本文档介绍如何使用 LocalResourceTamperingManager 和 VipResourceTamperingHelper 两个核心类实现批量篡改网络请求资源为本地文件的功能。通过这种方式,可以将网页中的所有静态资源(JS、CSS、图片、字体等)自动替换为本地文件,实现完全离线或者自定义资源的需求。
功能特性
- 🔄 批量处理:一次性设置整个文件夹的资源篡改
- 🎯 智能匹配:基于文件名进行模糊匹配,自动拦截相关网络请求
- 📋 自动分类:支持多种文件格式的MIME类型自动识别
- 📊 统计报告:提供详细的设置成功/失败统计信息
- 🛡️ VIP权限验证:确保只有VIP用户才能使用篡改功能
- 🔧 灵活管理:支持动态添加、移除和重置篡改规则
核心类说明
1. LocalResourceTamperingManager(本地资源篡改管理器)
负责具体的资源篡改实现,是底层的核心管理类。
主要功能:
- 扫描本地资源文件夹
- 设置单个文件的篡改规则
- MIME类型自动识别
- 统计信息收集
- 资源清理和释放
2. VipResourceTamperingHelper(VIP资源篡改助手)
提供简洁的静态方法接口,是对外的主要调用入口。
主要功能:
- 全局VIP状态管理
- 浏览器实例管理
- 简化的调用接口
- 批量清理操作
- 权限检查和验证
使用方法
第一步:准备资源文件
首先,创建一个 resource 文件夹,并按照类型组织你的本地资源文件:
resource/
├── js/
│ ├── main.js
│ ├── app.js
│ ├── config.js
│ └── lib/
│ ├── jquery.js
│ └── bootstrap.js
├── css/
│ ├── style.css
│ ├── theme.css
│ └── responsive.css
├── images/
│ ├── logo.png
│ ├── banner.jpg
│ └── icons/
│ ├── home.svg
│ └── user.svg
├── fonts/
│ ├── custom.woff2
│ └── icon-font.woff
└── other/
├── config.json
└── data.xml第二步:VIP权限设置
在程序启动时设置VIP权限:
csharp
// 在 Program.cs 中
class Program
{
static void Main()
{
// 设置VIP授权(这里需要你的实际授权码)
bool vipAuthorized = FBroSharpAPI.SetAuthorizationCode("你的VIP授权码");
// 告诉VipResourceTamperingHelper VIP权限状态
VipResourceTamperingHelper.SetGlobalVipStatus(vipAuthorized);
if (vipAuthorized)
{
Console.WriteLine("✅ VIP权限验证成功");
// 启动应用程序
Application.Run(new Form1());
}
else
{
Console.WriteLine("❌ VIP权限验证失败,程序将以普通模式运行");
// 可以选择继续运行但不启用篡改功能
Application.Run(new Form1());
}
}
}第三步:在浏览器创建后设置资源篡改
在浏览器创建完成的事件中调用资源篡改设置:
csharp
// 在 BrowserEvent.cs 的 OnAfterCreated 事件中
public void OnAfterCreated(IFBroSharpBrowser browser)
{
try
{
Console.WriteLine("浏览器创建完成,开始设置资源篡改...");
// 使用默认路径(程序目录/resource)
bool success = VipResourceTamperingHelper.SetupResourceTampering(browser);
if (success)
{
Console.WriteLine("🎉 资源篡改设置成功!");
// 获取篡改统计信息
int ruleCount = VipResourceTamperingHelper.GetTamperingRulesCount(browser);
Console.WriteLine($"📊 当前活跃篡改规则数量: {ruleCount}");
// 显示活跃的篡改规则
var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
Console.WriteLine("🔗 活跃篡改规则:");
foreach (var rule in activeRules)
{
Console.WriteLine($" - {rule.Key} -> {rule.Value}");
}
}
else
{
Console.WriteLine("❌ 资源篡改设置失败");
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ 设置资源篡改时发生错误: {ex.Message}");
}
}第四步:指定自定义资源路径(可选)
如果资源不在默认的 resource 文件夹中,可以指定自定义路径:
csharp
// 指定自定义资源路径
string customResourcePath = @"C:\MyCustomResources";
bool success = VipResourceTamperingHelper.SetupResourceTampering(browser, customResourcePath);第五步:清理资源篡改
在程序退出或浏览器关闭时清理资源:
csharp
// 在程序退出时清理所有资源篡改
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
Console.WriteLine("程序正在退出,清理资源篡改...");
// 清理所有浏览器的资源篡改
int cleanupCount = VipResourceTamperingHelper.CleanupAllResourceTampering();
Console.WriteLine($"✅ 已清理 {cleanupCount} 个浏览器的资源篡改设置");
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ 清理资源时发生错误: {ex.Message}");
}
}
// 或者清理单个浏览器的资源篡改
private void CleanupSingleBrowser(IFBroSharpBrowser browser)
{
VipResourceTamperingHelper.CleanupResourceTampering(browser);
}完整使用示例
以下是一个完整的使用示例:
csharp
using System;
using System.IO;
using System.Windows.Forms;
using FBroSharp;
using FBroSharp.Lib;
namespace _045VIP篡改请求为本地文件
{
public partial class Form1 : Form
{
private IFBroSharpBrowser _browser;
public Form1()
{
InitializeComponent();
CreateBrowser();
}
private void CreateBrowser()
{
try
{
// 创建浏览器实例
_browser = FBroSharpAPI.CreateBrowser(this, new FBroSharpBrowserInitSettings
{
Width = this.Width,
Height = this.Height,
StartURL = "https://example.com"
});
// 设置浏览器事件
_browser.BrowserEvent.OnAfterCreated += OnBrowserCreated;
_browser.BrowserEvent.OnBeforeClose += OnBrowserClosing;
}
catch (Exception ex)
{
MessageBox.Show($"创建浏览器失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void OnBrowserCreated(IFBroSharpBrowser browser)
{
try
{
Console.WriteLine("🔧 浏览器创建完成,开始设置资源篡改...");
// 检查资源文件夹是否存在
string resourcePath = Path.Combine(Application.StartupPath, "resource");
if (!Directory.Exists(resourcePath))
{
Console.WriteLine($"❌ 资源文件夹不存在: {resourcePath}");
Console.WriteLine("请创建resource文件夹并放入要篡改的资源文件");
return;
}
// 设置资源篡改
bool success = VipResourceTamperingHelper.SetupResourceTampering(browser, resourcePath);
if (success)
{
Console.WriteLine("🎉 资源篡改设置成功!");
// 显示详细统计信息
ShowTamperingStatus(browser);
}
else
{
Console.WriteLine("❌ 资源篡改设置失败,请检查VIP权限和资源文件");
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ 设置资源篡改时发生错误: {ex.Message}");
}
}
private void ShowTamperingStatus(IFBroSharpBrowser browser)
{
try
{
// 获取篡改规则数量
int ruleCount = VipResourceTamperingHelper.GetTamperingRulesCount(browser);
Console.WriteLine($"📊 活跃篡改规则数量: {ruleCount}");
// 显示活跃的篡改规则
var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
if (activeRules.Count > 0)
{
Console.WriteLine("🔗 活跃篡改规则列表:");
foreach (var rule in activeRules)
{
Console.WriteLine($" 📄 {rule.Key} -> {rule.Value}");
}
}
// 检查VIP权限状态
bool hasVipPermission = VipResourceTamperingHelper.CheckVipPermission(browser);
Console.WriteLine($"🛡️ VIP权限状态: {(hasVipPermission ? "✅ 有效" : "❌ 无效")}");
// 检查是否已启用资源篡改
bool isEnabled = VipResourceTamperingHelper.IsResourceTamperingEnabled(browser);
Console.WriteLine($"🔄 资源篡改状态: {(isEnabled ? "✅ 已启用" : "❌ 未启用")}");
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ 显示篡改状态时发生错误: {ex.Message}");
}
}
private void OnBrowserClosing(IFBroSharpBrowser browser)
{
try
{
Console.WriteLine("🔧 浏览器正在关闭,清理资源篡改...");
// 清理该浏览器的资源篡改
bool success = VipResourceTamperingHelper.CleanupResourceTampering(browser);
if (success)
{
Console.WriteLine("✅ 浏览器资源篡改清理成功");
}
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ 清理浏览器资源时发生错误: {ex.Message}");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
Console.WriteLine("🔧 程序正在退出,清理所有资源篡改...");
// 清理所有浏览器的资源篡改
int cleanupCount = VipResourceTamperingHelper.CleanupAllResourceTampering();
Console.WriteLine($"✅ 已清理 {cleanupCount} 个浏览器的资源篡改设置");
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ 程序退出清理时发生错误: {ex.Message}");
}
}
// 可选:提供手动重置功能
private void btnResetTampering_Click(object sender, EventArgs e)
{
try
{
if (_browser != null)
{
Console.WriteLine("🔄 手动重置资源篡改...");
// 重置资源篡改
bool success = VipResourceTamperingHelper.ResetResourceTampering(_browser);
if (success)
{
Console.WriteLine("✅ 资源篡改重置成功");
ShowTamperingStatus(_browser);
}
else
{
Console.WriteLine("❌ 资源篡改重置失败");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ 重置资源篡改时发生错误: {ex.Message}");
}
}
}
}支持的文件类型和MIME映射
系统自动支持以下文件类型的MIME类型识别:
JavaScript文件
.js→application/javascript.mjs→application/javascript
CSS文件
.css→text/css
图片文件
.png→image/png.jpg,.jpeg→image/jpeg.gif→image/gif.svg→image/svg+xml.webp→image/webp.ico→image/x-icon
字体文件
.woff→font/woff.woff2→font/woff2.ttf→font/ttf.otf→font/otf.eot→application/vnd.ms-fontobject
数据文件
.json→application/json.xml→application/xml.txt→text/plain
网页文件
.html,.htm→text/html
其他文件
.pdf→application/pdf.zip→application/zip.mp4→video/mp4.mp3→audio/mpeg
匹配机制说明
文件名模糊匹配
系统使用 FBroSharpResponseURLFindType.FuzzyMatch 进行文件名模糊匹配:
csharp
// 例如本地文件:resource/js/main.js
// 会匹配所有包含 "main.js" 的URL:
// ✅ https://cdn.example.com/assets/main.js
// ✅ https://example.com/static/js/main.js
// ✅ http://localhost:8080/dist/main.js
// ❌ https://example.com/other.js (不匹配)匹配优先级
当多个本地文件可能匹配同一个网络请求时,系统按照以下规则处理:
- 精确匹配优先:完全相同的文件名优先匹配
- 后设置覆盖:后设置的规则会覆盖先前的规则
- 文件扩展名匹配:相同扩展名的文件优先匹配
调试和诊断
1. 检查VIP权限
csharp
// 检查全局VIP状态
bool hasGlobalVip = VipResourceTamperingHelper.CheckVipPermission(browser);
// 检查浏览器VIP控制器
var vipControl = browser.GetVIPControl();
bool hasBrowserVip = vipControl?.IsValid == true;
Console.WriteLine($"全局VIP状态: {hasGlobalVip}");
Console.WriteLine($"浏览器VIP状态: {hasBrowserVip}");2. 查看篡改状态
csharp
// 显示所有浏览器的篡改状态
VipResourceTamperingHelper.PrintTamperingStatus();
// 检查特定浏览器是否启用了篡改
bool isEnabled = VipResourceTamperingHelper.IsResourceTamperingEnabled(browser);
Console.WriteLine($"浏览器篡改状态: {isEnabled}");3. 监控日志输出
系统会在控制台输出详细的操作日志,包括:
- VIP权限检查结果
- 文件扫描进度
- 篡改规则设置结果
- 错误和异常信息
常见问题
Q1: 为什么资源篡改不生效?
可能原因:
- VIP权限验证失败
- 资源文件夹路径不正确
- 本地文件名与网络请求URL不匹配
- 浏览器缓存影响
解决方法:
csharp
// 1. 检查VIP权限
bool hasVip = VipResourceTamperingHelper.CheckVipPermission(browser);
if (!hasVip)
{
Console.WriteLine("请检查VIP授权码是否正确");
}
// 2. 检查资源路径
string resourcePath = Path.Combine(Application.StartupPath, "resource");
if (!Directory.Exists(resourcePath))
{
Console.WriteLine($"资源文件夹不存在: {resourcePath}");
}
// 3. 清除浏览器缓存
browser.GetMainFrame().GetBrowser().GetHost().GetClient().GetLoadHandler().OnLoadEnd += (_, __) =>
{
browser.GetMainFrame().ExecuteJavaScript("location.reload(true);", "", 0);
};Q2: 如何处理动态生成的文件名?
对于带有版本号或hash的文件(如 main.abc123.js),建议:
- 重命名本地文件:将本地文件重命名为简化的名称(如
main.js) - 使用通用匹配:创建多个版本的文件来匹配不同的可能性
Q3: 如何验证篡改是否成功?
csharp
// 方法1: 检查网络请求
// 在浏览器中打开开发者工具,查看Network标签页,看请求是否被拦截
// 方法2: 在本地文件中添加标识
// 在CSS或JS文件中添加特殊注释,看是否在网页中生效
/* 🎯 本地资源篡改测试 - 如果你看到这个注释,说明篡改成功了! */
// 方法3: 检查活跃规则
var activeRules = VipResourceTamperingHelper.GetActiveTamperingRules(browser);
Console.WriteLine($"活跃规则数量: {activeRules.Count}");Q4: 如何处理CORS跨域问题?
系统自动为资源添加跨域响应头:
csharp
// 系统自动添加的响应头
headers.Add(new FBroSharpStringMap { key = "Access-Control-Allow-Origin", value = "*" });
// 对于字体文件,还会添加额外的跨域头
if (mimeType.StartsWith("font/"))
{
headers.Add(new FBroSharpStringMap {
key = "Access-Control-Allow-Headers",
value = "Origin, X-Requested-With, Content-Type, Accept"
});
}性能优化建议
1. 文件大小控制
- 避免过大的资源文件(建议单个文件不超过10MB)
- 对于大文件,考虑压缩或分割
2. 规则数量控制
- 避免设置过多的篡改规则(建议不超过1000个)
- 定期清理不需要的规则
3. 缓存优化
csharp
// 系统自动为资源添加缓存头
headers.Add(new FBroSharpStringMap { key = "Cache-Control", value = "public, max-age=31536000" });安全注意事项
- VIP权限保护:确保VIP授权码的安全,避免泄露
- 文件路径验证:避免使用用户输入的路径,防止路径遍历攻击
- 文件内容检查:对于重要的资源文件,建议进行内容校验
- 权限最小化:只为需要的文件设置篡改规则
总结
通过 LocalResourceTamperingManager 和 VipResourceTamperingHelper 两个类的配合使用,可以轻松实现批量的网络资源篡改功能。这种方式特别适用于:
- 离线应用开发:将网页应用转换为完全离线版本
- 资源本地化:替换CDN资源为本地资源,提高加载速度
- 开发调试:使用本地修改的资源进行调试
- 定制化改造:对现有web应用进行界面或功能定制
使用时请注意VIP权限验证和资源文件的正确配置,确保篡改功能能够正常工作。